tg-me.com/csharp_ci/1366
Last Update:
π οΈ ΠΠ°Π΄Π°ΡΠ° Ρ ΠΏΠΎΠ΄Π²ΠΎΡ
ΠΎΠΌ: ΠΠ΅Π½ΠΈΠ²Π°Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈ Π»ΠΎΠ²ΡΡΠΊΠ° ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΠΈ
Π£ΡΠ»ΠΎΠ²ΠΈΠ΅:
Π£ Π²Π°Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΠΊΠΎΠ΄:
using System;
using System.Threading;
class Program
{
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
});
static void Main()
{
for (int i = 0; i < 5; i++)
{
new Thread(() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Accessing HeavyObject...");
var obj = _heavy.Value;
}).Start();
}
Console.ReadLine();
}
}
class HeavyObject
{
public HeavyObject()
{
Thread.Sleep(1000); // ΡΠΌΡΠ»ΡΡΠΈΡ Π΄ΠΎΠ»Π³ΠΎΠΉ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] HeavyObject created.");
}
}
β ΠΠΎΠΏΡΠΎΡ:
Π‘ΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π²Ρ ΡΠ²ΠΈΠ΄ΠΈΡΠ΅ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅
Initializing HeavyObject...
ΠΈ HeavyObject created.
? ΠΠΎΡΠ΅ΠΌΡ ΡΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΄ΠΈΠ²ΠΈΡΡ Π΄Π°ΠΆΠ΅ ΠΎΠΏΡΡΠ½ΡΡ
.NET ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ²?π Π Π°Π·Π±ΠΎΡ:
ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ Π²Ρ ΠΎΠΆΠΈΠ΄Π°Π΅ΡΠ΅, ΡΡΠΎ:
- `Lazy<T>` Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ **Π»Π΅Π½ΠΈΠ²ΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·** Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ Π΄ΠΎΡΡΡΠΏΠ΅.
- Π‘ΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ `Initializing HeavyObject...` ΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ `HeavyObject` ΡΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·.
ΠΠΎ! Π’ΡΡ Π΅ΡΡΡ ΠΏΠΎΠ΄Π²ΠΎΡ .
ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `Lazy<T>` ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ **LazyThreadSafetyMode.ExecutionAndPublication**. ΠΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡΡ ΠΊ `.Value` ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ **ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·**.
β **ΠΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ Π²ΡΠ²ΠΎΠ΄:**
- ΠΠ°ΠΆΠ΄ΡΠΉ ΠΏΠΎΡΠΎΠΊ ΠΏΠΈΡΠ΅Ρ `Accessing HeavyObject...`
- Π’ΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΏΠΈΡΠ΅Ρ `Initializing HeavyObject...` ΠΈ `HeavyObject created.`
- ΠΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΈ Π΄ΠΎΠΆΠ΄ΡΡΡΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Ρ ΡΠΆΠ΅ Π³ΠΎΡΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ.
ΠΡΠΈΠΌΠ΅ΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄:
```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[7] Accessing HeavyObject...
[8] Accessing HeavyObject...
[4] Initializing HeavyObject...
[4] HeavyObject created.
```
π **ΠΠΎΠ΄Π²ΠΎΡ , Π΅ΡΠ»ΠΈ ΡΠΌΠ΅Π½ΠΈΡΡ ΡΠ΅ΠΆΠΈΠΌ:**
ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠ΄ Π²ΠΎΡ ΡΠ°ΠΊ:
```csharp
static Lazy<HeavyObject> _heavy = new Lazy<HeavyObject>(
() =>
{
Console.WriteLine($"[{Thread.CurrentThread.ManagedThreadId}] Initializing HeavyObject...");
return new HeavyObject();
},
LazyThreadSafetyMode.None // Π±Π΅Π· ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ
);
```
Π’ΠΎ ΠΏΡΠΈ **ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΌ** Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ `.Value` Π²Ρ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ **Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΉ** (ΠΏΠΎ ΡΡΡΠΈ Π³ΠΎΠ½ΠΊΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²).
ΠΡΠΈΠΌΠ΅ΡΠ½ΡΠΉ Π²ΡΠ²ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΡΠ°ΠΊΠΈΠΌ:
```
[4] Accessing HeavyObject...
[5] Accessing HeavyObject...
[6] Accessing HeavyObject...
[4] Initializing HeavyObject...
[5] Initializing HeavyObject...
[6] Initializing HeavyObject...
[4] HeavyObject created.
[5] HeavyObject created.
[6] HeavyObject created.
```
ΠΡΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡ Π±ΡΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·, ΡΡΠΎ Π»ΠΎΠΌΠ°Π΅Ρ ΠΈΠ½Π²Π°ΡΠΈΠ°Π½ΡΡ "Lazy Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·".
β **ΠΡΠ²ΠΎΠ΄:**
β’ ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ `Lazy<T>` **ΠΏΠΎΡΠΎΠΊΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ΅Π½**, Π½ΠΎ Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΠΈΠΌΠ°ΡΡ, ΡΡΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ **ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ**.
β’ ΠΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΡΡΡΡ Π² .NET Π²ΡΠ΅Π³Π΄Π° ΠΎΠ±ΡΠ°ΡΠ°ΠΉΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° **ΡΠ΅ΠΆΠΈΠΌ LazyThreadSafetyMode**.
β’ ΠΠ°ΠΆΠ΅ ΠΎΠΏΡΡΠ½ΡΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΌΠΎΠ³ΡΡ Π½Π΅ Π·Π°ΠΌΠ΅ΡΠΈΡΡ ΠΏΠΎΠ΄Π²ΠΎΡ Π°, Π΅ΡΠ»ΠΈ ΠΊΡΠΎ-ΡΠΎ ΠΏΠΎ ΠΎΡΠΈΠ±ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΈΠ· ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ `LazyThreadSafetyMode.None`.
π‘ **ΠΠΎΠ½ΡΡ-Π²ΠΎΠΏΡΠΎΡ:**
Π§ΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄ΡΡ, Π΅ΡΠ»ΠΈ Π²Π°Ρ factory-ΠΌΠ΅ΡΠΎΠ΄ (Π»ΡΠΌΠ±Π΄Π°) Π²ΡΠ±ΡΠΎΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ? ΠΠ°ΠΊ `Lazy<T>` ΠΏΠΎΠ²Π΅Π΄ΡΡ ΡΠ΅Π±Ρ ΠΏΡΠΈ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΌ Π΄ΠΎΡΡΡΠΏΠ΅ ΠΊ
.Value
BY C# (C Sharp) programming
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/csharp_ci/1366